package com.ddxz.tool.core.convert;

import net.sourceforge.pinyin4j.PinyinHelper;

/**
 * @author 朱宗刚
 * @version 1.0.0
 * @description com.casic.exchange.com.casic.common.tools.convert.PinYinUtil
 * @date 2020/2/28
 */
public class PinYinUtil {
    /**
     * 汉字转拼音，采用驼峰形式，无分隔符
     *
     * @param chinese 待转换汉子字符串
     * @return 驼峰形式拼音
     */
    public static String getPinYin(String chinese) {
        return getPinYin(chinese, PinYinType.PYT_HUMP_CASE);
    }

    /**
     * 汉字转拼音，指定拼音的形式
     *
     * @param chinese 带转换汉子字符串
     * @param type    拼音的类型
     * @return 按照指定类型转换后的拼音
     */
    public static String getPinYin(String chinese, PinYinType type) {
        return getPinYin(chinese, "", type);
    }

    /**
     * 汉字转拼音，指定拼音的形式和分隔符
     *
     * @param chinese   汉字字符串
     * @param delimiter 分隔符连接不同的汉字拼音
     * @param type      拼音的显示形式
     * @return 拼音字符串
     */
    public static String getPinYin(String chinese, String delimiter, PinYinType type) {
        return getPinYinByCase(chinese, delimiter, type);
    }

    /**
     * 按照指定的方式将汉子转换为拼音，并使用指定的连接符连接
     *
     * @param chinese   待转换汉子字符串
     * @param delimiter 连接符
     * @param type      拼音类型
     * @return 拼音字符串
     */
    private static String getPinYinByCase(String chinese, String delimiter, PinYinType type) {
        if (chinese == null || chinese.length() < 1) {
            return "";
        }

        StringBuilder pinYin = new StringBuilder("");
        char ch;
        String[] result;
        for (int idx = 0; idx < chinese.length(); ++idx) {
            ch = chinese.charAt(idx);
            if ((int) ch <= 128) {
                pinYin.append(ch);
            } else {
                result = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != result) {
                    switch (type) {
                        case PYT_LOWER_CASE:
                            pinYin.append(result[0].substring(0, result[0].length() - 1));
                            pinYin.append(idx == chinese.length() - 1 ? "" : delimiter);
                            break;
                        case PYT_UPPER_CASE:
                            pinYin.append(result[0].toUpperCase().substring(0, result[0].length() - 1));
                            pinYin.append(idx == chinese.length() - 1 ? "" : delimiter);
                            break;
                        case PYT_ACRONYM_CASE:
                            pinYin.append(result[0].toUpperCase().charAt(0));
                            pinYin.append(idx == chinese.length() - 1 ? "" : delimiter);
                            break;
                        default:
                            pinYin.append(result[0].toUpperCase().charAt(0));
                            pinYin.append(result[0].substring(1, result[0].length() - 1));
                            pinYin.append(idx == chinese.length() - 1 ? "" : delimiter);
                            break;
                    }
                }
            }
        }

        return pinYin.toString().replace("u:", "v").replace("U:", "V");
    }

    public static enum PinYinType {
        /**
         *  汉字转换成小写的拼音
         */
        PYT_LOWER_CASE,
        /**
         * 汉字转换成大写的拼音
         */
        PYT_UPPER_CASE,
        /**
         * 汉字转换为驼峰形式的拼音
         */
        PYT_HUMP_CASE,
        /**
         * 汉字转换为拼音的首字母缩写
         */
        PYT_ACRONYM_CASE
    }
}
